package cn.wolfcode.p2p.business.service;

import cn.wolfcode.p2p.base.query.BidRequestQueryObject;
import cn.wolfcode.p2p.base.query.QueryObject;
import cn.wolfcode.p2p.business.domain.BidRequest;
import cn.wolfcode.p2p.business.domain.PaymentSchedule;
import cn.wolfcode.p2p.util.PageResult;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 借款
 */
public interface IBidRequestService {
    /**
     * 借款申请
     * @param bidRequest
     */
    void apply(BidRequest bidRequest);

    /**
     * 查询待审核借款列表
     * @param qo
     * @return
     */
    PageResult queryForPage(QueryObject qo);

    /**
     *  发标待审核
     * @param id 借款对象的id
     * @param remark 风控备注
     * @param state 审核的结果
     * @param publishTime 发标时间
     */
    void publishBeforeAudit(Long id, String remark, Integer state, Date publishTime);

    void update(BidRequest bidRequest);

    /**
     * 查询待发标的借款 分页
     * @return
     */
    List<BidRequest> queryByStateAndPublishTime();

    /**
     * 查询中标中的借款
     */
    void publishForBidding();

    /**
     * 查询所有待发标中的借款
     */
    void listBidRequests();

    /**
     * 查询招标中的借款
     * @return
     */
    List<BidRequest> queryBiddingByState();

    List<BidRequest> queryExpBiddingByState();

    /**
     * 投资列表
     * @param qo
     * @return
     */
    PageResult investList(BidRequestQueryObject qo);

    /**
     * 查询借款
     * @param id 借款id
     * @return
     */
    BidRequest getBidRequestById(Long id);

    /**
     * 投标
     * @param bidRequestId 借款对象id
     * @param amount 投标金额
     * @return
     */
    void bidding(Long bidRequestId, BigDecimal amount);
    void expBidding(Long bidRequestId, BigDecimal amount);
    /**
     *  满标1审
     * @param id 借款对象的id
     * @param remark 风控备注
     * @param state 审核的结果
     */
    void bidRequestAudit1(Long id, String remark, Integer state);

    /**
     *  满标2审
     * @param id 借款对象的id
     * @param remark 风控备注
     * @param state 审核的结果
     */
    void bidRequestAudit2(Long id, String remark, Integer state);
    void expBidRequestAudit2(Long id, String remark, Integer state);

    /**
     * 还款
     * @param id 还款计划id
     */
    void returnMoney(Long id);

    /**
     * 逾期处理
     */
    void overdue();

    /**
     * 计算滞纳金
     */
    void latePayment();

    /**
     * 体验标发标
     * @param bidRequest
     */
    void expBidRequestPublish(BidRequest bidRequest);

    /**
     *体验标自动还款
     */
    void expRepayment(PaymentSchedule paymentSchedule);

    /**
     * 回收体验金
     */
    void recyclingExperience();

}
